package com.jch.dm.chapter_10_strategy;

/**
 * @author: jch
 * 策略模式 示例
 **/
public class Hand {
    /**
     * 石头
     */
    public static final int HAND_VALUE_GUU = 0;
    /**
     * 剪刀
     */
    public static final int HAND_VALUE_CHO = 1;
    /**
     * 布
     */
    public static final int HAND_VALUE_PAA = 2;

    /**
     * 手势
     */
    public static final Hand[] hand = {
            new Hand(HAND_VALUE_GUU),
            new Hand(HAND_VALUE_CHO),
            new Hand(HAND_VALUE_PAA)
    };

    /**
     * 名称
     */
    private static final String[] name = {
            "石头","剪刀","布"
    };

    /**
     * 手势的值
     */
    private int handValue;

    private Hand(int handValue) {
        this.handValue = handValue;
    }

    /**
     * 获取手势
     * @param handValue 手势值
     * @return 手势
     */
    public static Hand getHand(int handValue) {
        return hand[handValue];
    }

    /**
     * 是否胜利
     * @param h 手势
     * @return 是否胜利
     */
    public boolean isStrongerThan(Hand h) {
        return fight(h) == 1;
    }

    /**
     * 是否失败
     * @param h 手势
     * @return 是否失败
     */
    public boolean isWeakThan(Hand h) {
        return fight(h) == -1;
    }

    /**
     * 比赛
     * @param h 手势
     * @return 手势值
     */
    private int fight(Hand h) {
        if (this == h) {
            return 0;
        } else if ((this.handValue + 1) % 3 == h.handValue) {
            return 1;
        } else {
            return -1;
        }
    }

    @Override
    public String toString() {
        return name[handValue];
    }
}
